import torch
import torch.nn.functional as F
import torch_ctc

# 模拟模型输出的对数概率矩阵（log_probs），这里假设为一个随机生成的张量
# 实际应用中，log_probs 应由语音识别模型生成，维度为 [T, N, C]，T 为时间步，N 为 batch size，C 为字符类别数
T = 50  # 时间步数量
N = 16  # batch size
C = 26  # 假设字符类别数为 26（英文字母）
log_probs = torch.randn(T, N, C)

# 模拟真实标签（targets），维度为 [N]，每个元素为对应样本的真实标签索引
targets = torch.randint(0, C, (N,))

# 模拟输入长度列表（input_lengths）和目标长度列表（target_lengths），实际中应根据语音数据和标签长度设置
input_lengths = [T] * N
target_lengths = [len(targets)] * N

# 使用 torch-ctc 库的 ctc_loss 函数计算损失及强制对齐后的路径
loss, alignments = torch_ctc.ctc_loss(log_probs, targets, input_lengths, target_lengths, reduction='none', zero_infinity=True)

# 从 alignments 中提取强制对齐路径信息
# alignments 的维度为 [N, max_target_length]，每个元素为对应样本在每个时间步的预测字符索引
forced_alignment_paths = alignments[0]

# 以下可根据强制对齐路径信息进行后续处理，如转换为文本序列或分析对齐质量
# 例如，将索引转换为字符（假设存在字符映射字典 char_map）
char_map = {i: chr(ord('a') + i) for i in range(C)}
aligned_text = ''.join([char_map[idx] for idx in forced_alignment_paths if idx!= -1])

print("强制对齐后的文本序列:", aligned_text)